module basic
  use parameters
  use constants
  implicit none
  
contains
  
  ! 计算最大值的函数
  function amax(n, a)
    integer, intent(in) :: n
    real(kind=8), intent(in) :: a(n)
    real(kind=8) :: amax
    integer :: i
    
    amax = a(1)
    do i = 1, n
      if (a(i) > amax) amax = a(i)
    end do
  end function amax
  
  ! 计算最小值的函数
  function amin(n, a)
    integer, intent(in) :: n
    real(kind=8), intent(in) :: a(n)
    real(kind=8) :: amin
    integer :: i
    
    amin = a(1)
    do i = 1, n
      if (a(i) < amin) amin = a(i)
    end do
  end function amin
  
  ! 设置基本参数
  subroutine green_basic()
    real(kind=8) :: vp_max, vs_min, vave
    integer :: i
    
    ! 计算基本参数
    comp%m1 = 2**(comp%m-1)         ! 半采样点数
    comp%mt = 2 * comp%m1           ! 总采样点数
    comp%dt = comp%Twin / (comp%mt-1)   ! 时间间隔
    comp%fmax = 1.0d0 / (2.0d0 * comp%dt)  ! 奈奎斯特频率
    comp%df = comp%fmax / (comp%m1-1)      ! 频率间隔
    comp%oi = pi / comp%Twin/10           ! 虚频
    
    ! 计算最大和最小速度
    vp_max = amax(nly, media%vp0)   ! 最大速度
    vs_min = amin(nly, media%vs0)   ! 最小速度
    vave = 0.5 * (vp_max + vs_min)
    
    comp%L = (vp_max * comp%Twin + source%r0 + vp_max/vave * sqrt(source%r0*source%r0 + (source%zs-source%z0)**2)) + 100
    comp%dk = pi2 / comp%L         ! 波数间隔
    
    
    
    ! 计算剪切模量
    do i = 1, nly
      media%mu(i) = media%rho(i) * media%vs0(i)**2
    end do
    
    ! 初始化单位矩阵
  end subroutine green_basic
  
end module basic